package com.mars.admin.modules.post.mapper;

import com.mars.admin.modules.post.entity.TopicFollow;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 话题关注Mapper接口
 *
 * @author Mars
 * @version 1.0
 * @date 2025-01-07
 */
@Mapper
public interface TopicFollowMapper extends BaseMapper<TopicFollow> {

    /**
     * 根据用户ID和话题ID查询关注记录
     *
     * @param userId 用户ID
     * @param topicId 话题ID
     * @return 关注记录
     */
    TopicFollow selectByUserIdAndTopicId(@Param("userId") Long userId, @Param("topicId") Long topicId);

    /**
     * 根据用户ID查询关注的话题列表
     *
     * @param userId 用户ID
     * @param page 分页参数
     * @return 关注的话题列表
     */
    Page<TopicFollow> selectByUserId(@Param("userId") Long userId, Page<TopicFollow> page);

    /**
     * 根据话题ID查询关注的用户列表
     *
     * @param topicId 话题ID
     * @param page 分页参数
     * @return 关注的用户列表
     */
    Page<TopicFollow> selectByTopicId(@Param("topicId") Long topicId, Page<TopicFollow> page);

    /**
     * 根据用户ID查询关注的话题ID列表
     *
     * @param userId 用户ID
     * @return 话题ID列表
     */
    List<Long> selectTopicIdsByUserId(@Param("userId") Long userId);

    /**
     * 根据话题ID查询关注的用户ID列表
     *
     * @param topicId 话题ID
     * @return 用户ID列表
     */
    List<Long> selectUserIdsByTopicId(@Param("topicId") Long topicId);

    /**
     * 根据话题ID统计关注数量
     *
     * @param topicId 话题ID
     * @return 关注数量
     */
    int countByTopicId(@Param("topicId") Long topicId);

    /**
     * 根据用户ID统计关注的话题数量
     *
     * @param userId 用户ID
     * @return 关注的话题数量
     */
    int countByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID和话题ID删除关注记录
     *
     * @param userId 用户ID
     * @param topicId 话题ID
     * @return 删除数量
     */
    int deleteByUserIdAndTopicId(@Param("userId") Long userId, @Param("topicId") Long topicId);

    /**
     * 根据话题ID删除所有关注记录
     *
     * @param topicId 话题ID
     * @return 删除数量
     */
    int deleteByTopicId(@Param("topicId") Long topicId);

    /**
     * 根据用户ID删除所有关注记录
     *
     * @param userId 用户ID
     * @return 删除数量
     */
    int deleteByUserId(@Param("userId") Long userId);

    /**
     * 查询用户是否关注了话题
     *
     * @param userId 用户ID
     * @param topicId 话题ID
     * @return 是否关注
     */
    boolean isFollowing(@Param("userId") Long userId, @Param("topicId") Long topicId);

    /**
     * 查询热门关注的话题ID列表
     *
     * @param limit 限制数量
     * @return 话题ID列表
     */
    List<Long> selectHotFollowedTopicIds(@Param("limit") Integer limit);
} 